package com.liuqi.openai.data.document;

import java.util.HashMap;
import java.util.Map;

import static com.liuqi.openai.util.ValidationUtil.ensureNotNull;

/**
 * 表示文档或文本段的元数据。
 *
 * 元数据存储在键-值映射中，其中键和值都是字符串
 * 对于文档，元数据可以包含诸如来源、创建日期，所有者或任何其他相关详细信息。
 * 对于TextSegment，除了从文档复制的元数据之外，它还可以包括特定于段的信息，
 * 如页码、文档内的段的位置、章节等
 *
 * @author liuqi
 * @date 2025/7/19
 **/
public class Metadata {

    private final Map<String, String> metadata;

    public Metadata() {
        this(new HashMap<>());
    }

    public Metadata(Map<String, String> metadata) {
        this.metadata = ensureNotNull(metadata, "metadata");
    }

    public String get(String key) {
        return metadata.get(key);
    }

    public Metadata add(String key, Object value) {
        this.metadata.put(key, value.toString());
        return this;
    }

    public Metadata remove(String key) {
        this.metadata.remove(key);
        return this;
    }

    public Metadata copy() {
        return new Metadata(new HashMap<>(metadata));
    }

    public Map<String, String> asMap() {
        return new HashMap<>(metadata);
    }

    @Override
    public String toString() {
        return "Metadata {" +
                " metadata = " + metadata +
                " }";
    }

    public static Metadata from(String key, Object value) {
        return new Metadata().add(key, value);
    }

    public static Metadata from(Map<String, String> metadata) {
        return new Metadata(metadata);
    }

    public static Metadata metadata(String key, Object value) {
        return from(key, value);
    }

}
